/*
 * ListaClientePessoaFisicaPresenter
 * 
 * Versão 1.0
 * 
 * Data de criação: 27/05/2013
 * 
 * Copyright (c)
 * Autor: Odair José Tanes
 * Matrícula: 2009209186
 * Disciplina: Projeto de Sistemas de Software
 * 
 * Protótipo criado para exercício da disciplina
 *  
 * 
 */
package edu.ufes.pss.exercicioSwingBanco.presenter;

import edu.ufes.pss.exercicioSwingBanco.factory.DaoClientePessoaFisicaFactory;
import edu.ufes.pss.exercicioSwingBanco.interfaces.DaoInterface;
import edu.ufes.pss.exercicioSwingBanco.interfaces.PersistivelInterface;
import edu.ufes.pss.exercicioSwingBanco.model.ClientePessoaFisica;
import edu.ufes.pss.exercicioSwingBanco.view.ListaClientePessoaFisicaView;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Iterator;
import java.util.TreeSet;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author OdairJT
 */
public class ListaClientePessoaFisicaPresenter {

    private ListaClientePessoaFisicaView view;
    private DefaultTableModel modelo;

    public ListaClientePessoaFisicaPresenter() {

        this.view = new ListaClientePessoaFisicaView();

        loadTblClientesPessoaFisica();

        addListernerTxtFiltrar();
        addListenerBtnNova();
        addListenerBtnRecarregar();
        addListenerBtnVisualizar();
        addListenerBtnExcluir();
        addListenerBtnFechar();

        this.view.setLocationRelativeTo(null);
        this.view.getTblClientesPessoaFisica().grabFocus();
        this.view.setVisible(true);

    }

    public final void loadTblClientesPessoaFisica() {
        this.modelo = new DefaultTableModel(new Object[]{"NOME", "CPF", "TELEFONE"}, 0) {
            @Override
            public boolean isCellEditable(int rowIndex, int mColIndex) {
                return false;
            }
        };

        this.view.getTblClientesPessoaFisica().setModel(modelo);
        this.view.getTblClientesPessoaFisica().setSelectionMode(0);
        this.view.getTblClientesPessoaFisica().setShowGrid(true);
        this.view.getTblClientesPessoaFisica().setBackground(Color.LIGHT_GRAY);
        this.view.getTblClientesPessoaFisica().setForeground(Color.BLUE);

        /* O padrão factory retorna a instância de acordo com a forma 
         * de persistencia selecionada
         */

        DaoInterface p = DaoClientePessoaFisicaFactory.CriarDaoClientePessoaFisica(1);

        TreeSet<PersistivelInterface> clientesPessoaFisica = (TreeSet) p.buscarTodos();
        Iterator<PersistivelInterface> itClientesPessoaFisica = clientesPessoaFisica.iterator();
        ClientePessoaFisica tempClientePessoaFisica;

        while (itClientesPessoaFisica.hasNext()) {
            tempClientePessoaFisica = (ClientePessoaFisica) itClientesPessoaFisica.next();
            this.modelo.addRow(new Object[]{tempClientePessoaFisica.getNome(), tempClientePessoaFisica.getCpf(), tempClientePessoaFisica.getTelefone()});
        }
    }

    private void addListernerTxtFiltrar() {
        this.view.getTxtFiltrar().addFocusListener(
                new FocusListener() {
            @Override
            public void focusGained(FocusEvent fe) {
                focusGainedLostTxtFiltrar();
            }

            @Override
            public void focusLost(FocusEvent fe) {
                focusGainedLostTxtFiltrar();
            }
        });

        this.view.getTxtFiltrar()
                .addKeyListener(
                new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent ke) {
                actionPerformedTxtFiltrar();
            }
        });

    }

    private void focusGainedLostTxtFiltrar() {
        if (this.view.getTxtFiltrar().getText().equals("")) {
            this.view.getTxtFiltrar().setText("Filtrar");
        } else if (this.view.getTxtFiltrar().getText().equals("Filtrar")) {
            this.view.getTxtFiltrar().setText("");
        }
    }

    private void actionPerformedTxtFiltrar() {
        DaoInterface p = DaoClientePessoaFisicaFactory.CriarDaoClientePessoaFisica(1);

        TreeSet<PersistivelInterface> clientesPessoaFisica = (TreeSet) p.buscarTodos();
        Iterator<PersistivelInterface> itClientesPessoaFisica = clientesPessoaFisica.iterator();
        ClientePessoaFisica tempClientePessoaFisica;

        this.modelo.setNumRows(0);

        while (itClientesPessoaFisica.hasNext()) {
            tempClientePessoaFisica = (ClientePessoaFisica) itClientesPessoaFisica.next();

            int limite = this.view.getTxtFiltrar().getText().length();

            String nome = tempClientePessoaFisica.getNome();
            String filtro = this.view.getTxtFiltrar().getText();

            if (nome.length() < limite) {
                limite = nome.length();
            }

            if (nome.substring(0, limite).toLowerCase().equals(filtro.toLowerCase())) {
                this.modelo.addRow(new Object[]{tempClientePessoaFisica.getNome(), tempClientePessoaFisica.getCpf(), tempClientePessoaFisica.getTelefone()});
            }
        }

    }

    private void addListenerBtnNova() {
        this.view.getBtnNovo().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnNova();
            }
        });
    }

    private void actionPerformedBtnNova() {
        CrudClientePessoaFisicaPresenter c = new CrudClientePessoaFisicaPresenter();
        this.view.dispose();
    }

    private void addListenerBtnRecarregar() {
        this.view.getBtnRecarregar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnRecarregar();
            }
        });
    }

    private void actionPerformedBtnRecarregar() {
        this.view.setCursor(new Cursor(3));
        this.loadTblClientesPessoaFisica();
        this.view.setCursor(new Cursor(0));
    }

    private void addListenerBtnVisualizar() {
        this.view.getBtnVisualizar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnVisualizar();
            }
        });
    }

    private void actionPerformedBtnVisualizar() {

        if (this.view.getTblClientesPessoaFisica().getSelectedRow() != -1) {
            String cpf = (String) this.view.getTblClientesPessoaFisica().getValueAt(this.view.getTblClientesPessoaFisica().getSelectedRow(), 1);
            CrudClientePessoaFisicaPresenter c = new CrudClientePessoaFisicaPresenter(cpf);
            this.view.dispose();
        } else {
            this.view.showMessage("Selecione uma linha para continuar!");
        }

    }

    private void addListenerBtnExcluir() {
        this.view.getBtnExcluir().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnExcluir();
            }
        });
    }

    private void actionPerformedBtnExcluir() {
        if (this.view.getTblClientesPessoaFisica().getSelectedRow() != -1) {

            /* O padrão factory retorna a instância de acordo com a forma 
             * de persistencia selecionada
             */

            DaoInterface daoClientePessoaFisica = DaoClientePessoaFisicaFactory.CriarDaoClientePessoaFisica(1);

            String cpf = (String) this.view.getTblClientesPessoaFisica().getValueAt(
                    (Integer) this.view.getTblClientesPessoaFisica().getSelectedRow(),
                    1);

            ClientePessoaFisica tempClientePessoaFisica = (ClientePessoaFisica) daoClientePessoaFisica.buscarObjeto(cpf);

            if (this.view.showConfirmMessage("Verificação de ação", "Excluir?") == 0) {
                if (daoClientePessoaFisica.excluir(tempClientePessoaFisica)) {
                    loadTblClientesPessoaFisica();
                }
            }
        } else {
            this.view.showMessage("Selecione uma linha para continuar!");
        }
    }

    private void addListenerBtnFechar() {
        this.view.getBtnFechar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnFechar();
            }
        });
    }

    private void actionPerformedBtnFechar() {
        this.view.dispose();
    }
}
